package com.gitee.helioz.openai.api.dto.finetune;

import com.google.gson.annotations.SerializedName;
import lombok.Data;

import java.util.List;

/**
 * 〈创建微调响应〉
 *
 * @author <a href="https://gitee.com/helioz">Morning Starr</a>
 */
@Data
public class FineTuneResponse {

    /**
     * 任务ID
     */
    private String id;
    /**
     * 对象类型，值为"fine-tune"
     */
    private String object;
    /**
     * 被微调的模型信息
     */
    private String model;
    /**
     * 任务创建时间戳
     */
    @SerializedName("created_at")
    private Long createdAt;
    /**
     * 微调事件集合
     */
    private List<FineTuneEvent> events;
    /**
     * 微调模型信息
     */
    @SerializedName("fine_tuned_model")
    private FineTunedModel fineTunedModel;
    /**
     * 训练超参数
     */
    @SerializedName("hyperparams")
    private HyperParams hyperParams;
    /**
     * 组织 ID
     */
    @SerializedName("organization_id")
    private String organizationId;
    /**
     * 结果文件列表
     */
    @SerializedName("result_files")
    private List<FineTuneFile> resultFiles;
    /**
     * 作业的状态，包括"queued"（已入队）、"running"（运行中）、"succeeded"（成功完成）和"failed"（失败）。
     */
    private String status;
    /**
     * 验证文件列表
     */
    @SerializedName("validation_files")
    private List<FineTuneFile> validationFiles;
    /**
     * 训练文件列表
     */
    @SerializedName("training_files")
    private List<FineTuneFile> trainingFiles;
    /**
     * 更新时间
     */
    @SerializedName("updated_at")
    private Long updatedAt;

    @Data
    public static class FineTunedModel {
        /***/
        private String model;
        /***/
        private String id;
        /***/
        private String object;
        /***/
        @SerializedName("created_at")
        private Long createdAt;
        /***/
        private String name;
    }

    @Data
    public static class HyperParams {
        /**
         * 批处理大小
         */
        @SerializedName("batch_size")
        private Integer batchSize;
        /**
         * 学习率乘法器
         */
        @SerializedName("learning_rate_multiplier")
        private Double learningRateMultiplier;
        /**
         * 迭代轮数
         */
        @SerializedName("n_epochs")
        private Integer nEpochs;
        /**
         * 提示标记的损失权重
         */
        @SerializedName("prompt_loss_weight")
        private Double promptLossWeight;
    }

    @Data
    public static class FineTuneFile {
        /**
         * 文件ID
         */
        private String id;
        /**
         * 对象类型:file
         */
        private String object;
        /**
         * 文件大小（字节）
         */
        private long bytes;
        /**
         * 创建时间
         */
        @SerializedName("created_at")
        private long createdAt;
        /**
         * 文件名
         */
        private String filename;
        /**
         * 文件用途（fine-tune-validation、fine-tune-train）
         */
        private String purpose;
    }

}
